package Multithread.LockStrategy;

import java.util.concurrent.atomic.AtomicInteger;
/**
 * 锁策略
 * 线程是否要锁住同步资源
 * 1.乐观锁
 */
public class lockStrategy_01 {

    public static void main(String[] args) {

    }

}

/**
 * 1.乐观锁
 * CAS算法(比较和交换)：
 *   主内存中变量V，线程中变量A（变量V的副本）和变量B（将要赋值给变量V的值）
 *   赋值操作时，JVM会先将变量A与变量V比较，
 *     如果相同，则认为可以操作，然后把变量B赋值给变量V，操作完成。
 *     如果不相同，则开始自旋（重新把变量V加载给变量A，然后再次判断，如此循环（do-while）,可以控制自旋次数），直到操作成功。
 * 比较和交换的动作是原子性的
 * CAS算法的缺点：
 *   循环时间长、开销大。
 *   只能保证一个共享变量的原子操作。AtomicReference类可以保证引用对象之间的原子性，可以把多个变量放在一个对象里来进行CAS操作。
 *   ABA问题：
 *      变量V值反复变化时，其他线程无法感知到（如V的值变化0->1->0）。
 *      解决办法：AtomicStampedReference类在变量前面添加版本号，每次变量更新时版本号加一。
 */
class OptimisticLock {
    private AtomicInteger var = new AtomicInteger(0); // 版本号

    public synchronized void updateData(int newData) {
        //AtomicInteger的incrementAndGet方法和compareAndSet方法就是CAS算法
//        var.incrementAndGet(); // 更新值（自增）

        var.compareAndSet(newData,10);  //更新值（赋值）
    }

    public int getVersion() {
        return var.get();
    }
}

